#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
// zdl:: 这道题目其实就是一道比较费劲的模拟题目
const int N = 1e5 + 10;
struct node
{
    int id, a, t;
    // zdl:: 这里想要创建小根堆，堆的< 符号重载与实际的相反

    bool operator<(const node &x) const
    {
        return id > x.id;
    }
} e[N];
priority_queue<node> q;

int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        int a, t;
        cin >> a >> t;
        e[i].id = i;
        e[i].a = a;
        e[i].t = t;
    }
    // 现在开始按照到达时间进行排序
    sort(e + 1, e + 1 + n, [](node &x, node &y)
        { return x.a < y.a; });
    // 现在就是开始模拟的时候了
    int i = 1, end = 0;
    int ret = 0;
    while (i <= n || q.size())
    {
        while (i <= n && end >= e[i].a) q.emplace(e[i++]);
        if (q.empty()) q.emplace(e[i++]);

        auto c = q.top();
        q.pop();
        if (end <= c.a) end = c.a + c.t;
        else 
        {
            ret = max(ret, end - c.a);
            end += c.t;
        }
    }

    cout << ret << endl;
    return 0;
}